{
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7-final"
  },
  "orig_nbformat": 2,
  "kernelspec": {
   "name": "python3",
   "display_name": "DataAnalysis"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2,
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tools import *\n",
    "from func import *\n",
    "%matplotlib inline"
   ]
  },
  {
   "source": [
    "## 2.4 词典资源\n",
    "-   词项：包括词目(也叫词条)及其他附加信息。\n",
    "-   同音异义词：两个含义不同但是拼写相同的分词。\n",
    "### 2.4.1 词汇列表语料库\n",
    "过滤文本，删除掉常见英语词典中的单词，留下罕见的或者拼写错误的词汇"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "--------------- >austen-sense 中的非常用词汇< ---------------\n",
      "['abbeyland', 'abhorred', 'abilities', 'abounded', 'abridgement', 'abused', 'abuses', 'accents', 'accepting', 'accommodations', 'accompanied', 'accounted', 'accounts']\n",
      "--------------- >nps_chat 中的非常用词汇：< ---------------\n",
      "['aaaaaaaaaaaaaaaaa', 'aaahhhh', 'abortions', 'abou', 'abourted', 'abs', 'ack', 'acros', 'actualy', 'adams', 'adds', 'adduser', 'adjusts']\n"
     ]
    }
   ],
   "source": [
    "show_subtitle(\"austen-sense 中的非常用词汇\")\n",
    "print(unusual_words(nltk.corpus.gutenberg.words('austen-sense.txt'))[:13])\n",
    "show_subtitle(\"nps_chat 中的非常用词汇：\")\n",
    "print(unusual_words(nltk.corpus.nps_chat.words())[:13])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "--------------- >english stopwords< ---------------\n['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now']\n"
     ]
    }
   ],
   "source": [
    "# 停止词语料库(stopwords)：包括的是高频词汇，是会使说话停止的单词，不是不再使用的单词\n",
    "from nltk.corpus import stopwords\n",
    "\n",
    "show_subtitle(\"english stopwords\")\n",
    "print(stopwords.words('english'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "reuters 中非停用词所占的比例= 0.7364374824583169\n"
     ]
    }
   ],
   "source": [
    "# 利用停止词，筛选掉文本中三分之一的单词\n",
    "print(\"reuters 中非停用词所占的比例=\", content_fraction(nltk.corpus.reuters.words()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "--------------- >puzzle letters tabulate< ---------------\n",
      "v e g i r o n l \n",
      "2 1 1 1 1 1 1 1 \n",
      "target word list=  ['glover', 'gorlin', 'govern', 'grovel', 'ignore', 'involver', 'lienor', 'linger', 'longer', 'lovering', 'noiler', 'overling', 'region', 'renvoi', 'revolving', 'ringle', 'roving', 'violer', 'virole']\n"
     ]
    }
   ],
   "source": [
    "# 图2-6：词谜：在由随机选择的字母组成的网格中，选择里面的字母组成单词。\n",
    "# 这个谜题叫做「目标」\n",
    "# 使用 ‘egivrvonl’ 字母可以组成多少个不少于6个字母的单词？\n",
    "# 确保「r」字母出现，其他字母出现频率不高于 puzzle_letters 的要求\n",
    "puzzle_letters = nltk.FreqDist('egivrvonl')\n",
    "show_subtitle(\"puzzle letters tabulate\")\n",
    "puzzle_letters.tabulate()\n",
    "\n",
    "obligatory = 'r'\n",
    "word_list = nltk.corpus.words.words()\n",
    "target_word_list = [\n",
    "        w\n",
    "        for w in word_list\n",
    "        if len(w) >= 6 and obligatory in w and nltk.FreqDist(w) <= puzzle_letters\n",
    "]\n",
    "print(\"target word list= \", target_word_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "name file list= ['female.txt', 'male.txt']\n",
      "name list= ['Abbey', 'Abbie', 'Abby', 'Addie', 'Adrian', 'Adrien', 'Ajay', 'Alex', 'Alexis', 'Alfie', 'Ali', 'Alix', 'Allie']\n",
      "name list length=  365\n"
     ]
    }
   ],
   "source": [
    "# 使用名字语料库\n",
    "# 找出同时出现在两个语料库中的名字(即无法分辨性别的名字)\n",
    "names = nltk.corpus.names\n",
    "print(\"name file list=\", names.fileids())\n",
    "male_names = names.words('male.txt')\n",
    "female_names = names.words('female.txt')\n",
    "name_list = [\n",
    "        w\n",
    "        for w in male_names\n",
    "        if w in female_names\n",
    "]\n",
    "print(\"name list=\", name_list[:13])\n",
    "print(\"name list length= \", len(name_list))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "--------------- >使用 set() 函数计算< ---------------\nname list= ['Kerry', 'Sonny', 'Jermaine', 'Dale', 'Nickie', 'Eddie', 'Vin', 'Angie', 'Van', 'Donnie', 'Terry', 'Georgie', 'Lauren']\nname list length=  365\n"
     ]
    }
   ],
   "source": [
    "show_subtitle(\"使用 set() 函数计算\")\n",
    "print(\"name list=\", list(set(male_names).difference(set(male_names).difference(female_names)))[:13])\n",
    "print(\"name list length= \", len(set(male_names).difference(set(male_names).difference(female_names))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "('female.txt', 'el')\n('female.txt', 'il')\n('female.txt', 'be')\n('female.txt', 'ey')\n('female.txt', 'bi')\n('female.txt', 'ie')\n('female.txt', 'by')\n('female.txt', 'el')\n('female.txt', 'il')\n('female.txt', 'le')\n('female.txt', 'ra')\n('female.txt', 'ia')\n('female.txt', 'da')\n"
     ]
    }
   ],
   "source": [
    "name_ends = (\n",
    "        (fileid, name[-2:])\n",
    "        for fileid in names.fileids()\n",
    "        for name in names.words(fileid)\n",
    ")\n",
    "for i, name_end in enumerate(name_ends):\n",
    "    if i<13:\n",
    "        print(name_end)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvXmcHFW9v/+c6mW2zEy2STJZSMIiEAhJmIAIIgiCCOYKP+C6I14FUbxyuYiXryyuqLjhAhrBDcELCldUQEJCCAQStgQSAtlDMknIMpPZp/euOr8/qpeq6u6Znunq7pnOeV6vZLqrq+qcqq4+7/NZzjlCSolCoVAoFABauSugUCgUipGDEgWFQqFQpFCioFAoFIoUShQUCoVCkUKJgkKhUChSKFFQKBQKRQolCgqFQqFIoURBoVAoFCmUKCgUCoUihbfcFRgqEydOlLNmzRrWsaFQaNB9ampq8tqvGMeXs+xyHz+a617o8aruo/P4cpRdU1Mz7PLWrl17SErZNNh+o04UZs2axZo1a4Z17Nq1awfdp6WlJa/9inF8Ocsu9/Gjue6FHq/qPjqPL0fZLS0twy5PCNGaz37KfaRQKBSKFEoUFAqFQpFCiYJCoVAoUoy6mIJCoRidaJqGEAIhRGrbpk2b8HqH3wyV8/hylL1p06ZB96murmb69On4fL5h1UuJgkKhKDqapjFp0iQaGxttolBXV0cgEBj2ect5fDnKrqurG/BzKSUdHR3s3buX2bNnD6teyn2kUCiKjhAiQxAU7iOEYMKECYTD4WGfQ4mCQjFKGM2rJDrdRoriUeh9VqKgUIwCfrO2h/9e1kHMGL3CoBgdKFFQKEYBrx2IsLsnTkdQL3dVRjV//etfOeusszjvvPPYuXOnK+e85pprWLBgAbfffvuwz7FixQp27dqV177Lly93re7ZUKKgUIwGlIHgCt/73vd44oknWLZs2bADsU4WL17MDTfcUNA5HnroIXbv3p3Xvvfffz+trXkNTh4WKvtIoRgFSMff0cwJ33m2KOd969azB90nFosxZsyY1Ptdu3Zx1VVXEQwGaW5u5re//S1/+ctfWLFiBRs2bODCCy/k6aefZsWKFbz55pvceOONCCHweDw8/vjjOVNKOzs7+dKXvkR3dzd1dXX87ne/Y+zYsVn3veCCC9i6dStvvPEGjY2NfP7zn+fcc8/l3HPP5eGHH6ahoYELL7yQxx9/nP/4j/9g8+bNrFu3jrFjx/LFL36Rj370o8O6X7lQloJCMQpIxphHcay5rNx9991ccMEFHDhwgAsuuIALLrgAXde58cYbueWWW1i6dCnTpk3j0UcfBWD8+PEsWrSICRMmMGfOHA4ePMjcuXN5+umnWbZsGSeeeCJPPfVUzvJ+8pOfcPnll7NkyRLOO+88fvvb3+bcN7nPHXfcwZIlS7jssssYN24cd911F9deey033HAD3/ve95g8eTLPPvssF1xwAT/72c949tlnXRcEUJaCQjEqqCRLwdqjL1Wu/7XXXsu1117LnDlzWLJkSWr7m2++yS233AJAIBBgxowZ1NfXM2/ePFpbW5k3bx5vvvkmuq6zbds2br31VgKBAK2trbz73e/OWd7GjRtZvXo19957L5FIhPe+971DvrbTTz+dsWPH0tfXx3nnnTfk44eLEgWFYhSgLIXicNRRR3HTTTexYMGC1LYHHngg67533nknV1xxBYsWLeJLX/rSgOedPXs273vf+7j44oszPrvtttsYO3Yst956a2pbTU0NXV1dtv2efvppYrEYmqaxZMkSLrjgAgBqa2vp7OzM+xqHihIFhWIUUEmWwkjijjvu4Atf+AKapuHz+bjjjjty7vvBD36Q22+/nd///vc0NDSktl900UXs27ePSCTCmjVrePTRR/nqV7/KNddcw+LFi/H5fNx44428733vA2Dnzp1MmDDBdu5PfOITfOUrX+HXv/41n//85zn99NO58cYb+de//oUQggsuuIDjjjuOE044gSuuuIIvfOEL/OIXvyhKTEGJgkIxCkgOXBvNA9hGAhs3brS9P+GEEzJiA8cff7ztfbIxnzlzJpdeemlqe9J19cQTT2SUM3XqVP75z39mrcP999+fse3UU0/lpZdesm17/fXXU6/XrVuXen3aaaexfv36rOd2AxVoVihGAcpSUJQKJQoKxSggJQpKFRRFRomCQjEKUGKgKBVKFBSKUUBSE9TUR4pio0RBoRgFKEtBUSqUKCgUowAVaFaUCiUKioplS0eUg4F4uavhCmrwWmm55JJLmDNnTs6BbPnw97//PWNAmhv7FhslCoqKpDdicMuKTn7yYne5q+IKMmEjSGUrlIRHH32UT37ykwWdY/HixfT29rq+b7FR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\n"
     },
     "metadata": {
      "needs_background": "light"
     }
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "            el  il  be  ey  bi  ie  by  le  ra  ia  da \nfemale.txt  70  21   7 101  16 408  18 148 163 247 136 \n  male.txt  65  24   7  86   2 150  18  42   3   3   0 \n"
     ]
    }
   ],
   "source": [
    "name_ends = (\n",
    "        (fileid, name[-2:])\n",
    "        for fileid in names.fileids()\n",
    "        for name in names.words(fileid)\n",
    ")\n",
    "cfd = nltk.ConditionalFreqDist(name_ends)\n",
    "cfd.plot()  # 图2-7 显示男性与女性名字的结尾字母\n",
    "cfd.tabulate(samples=['el', 'il', 'be', 'ey', 'bi', 'ie', 'by', 'le', 'ra', 'ia', 'da'])"
   ]
  },
  {
   "source": [
    "### 2.4.2 发音词典"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "len(entries)=  133737\n('explorer', ['IH0', 'K', 'S', 'P', 'L', 'AO1', 'R', 'ER0'])\n('explorers', ['IH0', 'K', 'S', 'P', 'L', 'AO1', 'R', 'ER0', 'Z'])\n('explores', ['IH0', 'K', 'S', 'P', 'L', 'AO1', 'R', 'Z'])\n('exploring', ['IH0', 'K', 'S', 'P', 'L', 'AO1', 'R', 'IH0', 'NG'])\n('explosion', ['IH0', 'K', 'S', 'P', 'L', 'OW1', 'ZH', 'AH0', 'N'])\n('explosions', ['IH0', 'K', 'S', 'P', 'L', 'OW1', 'ZH', 'AH0', 'N', 'Z'])\n('explosive', ['IH0', 'K', 'S', 'P', 'L', 'OW1', 'S', 'IH0', 'V'])\n('explosively', ['EH2', 'K', 'S', 'P', 'L', 'OW1', 'S', 'IH0', 'V', 'L', 'IY0'])\n"
     ]
    }
   ],
   "source": [
    "# cmudict：美国英语的 CMU 发音词典，为语音合成器提供支持\n",
    "entries = nltk.corpus.cmudict.entries()\n",
    "print(\"len(entries)= \", len(entries))\n",
    "for entry in entries[39943:39951]:\n",
    "    print(entry)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "pait P EY1 T\npat P AE1 T\npate P EY1 T\npatt P AE1 T\npeart P ER1 T\npeat P IY1 T\npeet P IY1 T\npeete P IY1 T\npert P ER1 T\npet P EH1 T\npete P IY1 T\npett P EH1 T\npiet P IY1 T\npiette P IY1 T\npit P IH1 T\npitt P IH1 T\npot P AA1 T\npote P OW1 T\npott P AA1 T\npout P AW1 T\npuett P UW1 T\npurt P ER1 T\nput P UH1 T\nputt P AH1 T\n"
     ]
    }
   ],
   "source": [
    "# 寻找词典中发音包含三个音素的条目\n",
    "for word, pron in entries:\n",
    "    if len(pron) == 3:\n",
    "        ph1, ph2, ph3 = pron\n",
    "        if ph1 == 'P' and ph3 == 'T':\n",
    "            print(word, ph1, ph2, ph3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[\"atlantic's\", 'audiotronics', 'avionics', 'beatniks', 'calisthenics', 'centronics', 'chamonix', 'chetniks', \"clinic's\", 'clinics', 'conics', 'conics', 'cryogenics', 'cynics', 'diasonics', \"dominic's\", 'ebonics', 'electronics', \"electronics'\", \"endotronics'\", 'endotronics', 'enix', 'environics', 'ethnics', 'eugenics', 'fibronics', 'flextronics', 'harmonics', 'hispanics', 'histrionics', 'identics', 'ionics', 'kibbutzniks', 'lasersonics', 'lumonics', 'mannix', 'mechanics', \"mechanics'\", 'microelectronics', 'minix', 'minnix', 'mnemonics', 'mnemonics', 'molonicks', 'mullenix', 'mullenix', 'mullinix', 'mulnix', \"munich's\", 'nucleonics', 'onyx', 'organics', \"panic's\", 'panics', 'penix', 'pennix', 'personics', 'phenix', \"philharmonic's\", 'phoenix', 'phonics', 'photronics', 'pinnix', 'plantronics', 'pyrotechnics', 'refuseniks', \"resnick's\", 'respironics', 'sconnix', 'siliconix', 'skolniks', 'sonics', 'sputniks', 'technics', 'tectonics', 'tektronix', 'telectronics', 'telephonics', 'tonics', 'unix', \"vinick's\", \"vinnick's\", 'vitronics']\n"
     ]
    }
   ],
   "source": [
    "# 寻找所有与 nicks 发音相似的单词\n",
    "syllable = ['N', 'IH0', 'K', 'S']\n",
    "word_list = [\n",
    "        word\n",
    "        for word, pron in entries\n",
    "        if pron[-4:] == syllable\n",
    "]\n",
    "print(word_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "['autumn', 'column', 'condemn', 'damn', 'goddamn', 'hymn', 'solemn']\n"
     ]
    }
   ],
   "source": [
    "# 寻找拼写以'n'结尾，发音以'M'结尾的单词\n",
    "word_list = [\n",
    "        w\n",
    "        for w, pron in entries\n",
    "        if pron[-1] == 'M' and w[-1] == 'n'\n",
    "]\n",
    "print(word_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[('abbreviated', ['AH0', 'B', 'R', 'IY1', 'V', 'IY0', 'EY2', 'T', 'AH0', 'D']), ('abbreviated', ['AH0', 'B', 'R', 'IY1', 'V', 'IY0', 'EY2', 'T', 'IH0', 'D']), ('abbreviating', ['AH0', 'B', 'R', 'IY1', 'V', 'IY0', 'EY2', 'T', 'IH0', 'NG']), ('accelerated', ['AE0', 'K', 'S', 'EH1', 'L', 'ER0', 'EY2', 'T', 'IH0', 'D']), ('accelerating', ['AE0', 'K', 'S', 'EH1', 'L', 'ER0', 'EY2', 'T', 'IH0', 'NG']), ('accelerator', ['AE0', 'K', 'S', 'EH1', 'L', 'ER0', 'EY2', 'T', 'ER0']), ('accelerators', ['AE0', 'K', 'S', 'EH1', 'L', 'ER0', 'EY2', 'T', 'ER0', 'Z']), ('accentuated', ['AE0', 'K', 'S', 'EH1', 'N', 'CH', 'AH0', 'W', 'EY2', 'T', 'IH0', 'D']), ('accentuating', ['AE0', 'K', 'S', 'EH1', 'N', 'CH', 'AH0', 'W', 'EY2', 'T', 'IH0', 'NG']), ('accommodated', ['AH0', 'K', 'AA1', 'M', 'AH0', 'D', 'EY2', 'T', 'AH0', 'D']), ('accommodating', ['AH0', 'K', 'AA1', 'M', 'AH0', 'D', 'EY2', 'T', 'IH0', 'NG']), ('accommodative', ['AH0', 'K', 'AA1', 'M', 'AH0', 'D', 'EY2', 'T', 'IH0', 'V']), ('accumulated', ['AH0', 'K', 'Y', 'UW1', 'M', 'Y', 'AH0', 'L', 'EY2', 'T', 'IH0', 'D'])]\n"
     ]
    }
   ],
   "source": [
    "# 提取重音数字(0-无重音，1-主重音，2-次重音)\n",
    "word_list = [\n",
    "        (w, pron)\n",
    "        for w, pron in entries\n",
    "        if stress(pron) == ['0', '1', '0', '2', '0']\n",
    "]\n",
    "print(word_list[:13])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[('abbreviation', ['AH0', 'B', 'R', 'IY2', 'V', 'IY0', 'EY1', 'SH', 'AH0', 'N']), ('abbreviations', ['AH0', 'B', 'R', 'IY2', 'V', 'IY0', 'EY1', 'SH', 'AH0', 'N', 'Z']), ('abomination', ['AH0', 'B', 'AA2', 'M', 'AH0', 'N', 'EY1', 'SH', 'AH0', 'N']), ('abortifacient', ['AH0', 'B', 'AO2', 'R', 'T', 'AH0', 'F', 'EY1', 'SH', 'AH0', 'N', 'T']), ('abortifacients', ['AH0', 'B', 'AO2', 'R', 'T', 'AH0', 'F', 'EY1', 'SH', 'AH0', 'N', 'T', 'S']), ('academicians', ['AH0', 'K', 'AE2', 'D', 'AH0', 'M', 'IH1', 'SH', 'AH0', 'N', 'Z']), ('accommodation', ['AH0', 'K', 'AA2', 'M', 'AH0', 'D', 'EY1', 'SH', 'AH0', 'N']), ('accommodations', ['AH0', 'K', 'AA2', 'M', 'AH0', 'D', 'EY1', 'SH', 'AH0', 'N', 'Z']), ('accreditation', ['AH0', 'K', 'R', 'EH2', 'D', 'AH0', 'T', 'EY1', 'SH', 'AH0', 'N']), ('accreditations', ['AH0', 'K', 'R', 'EH2', 'D', 'AH0', 'D', 'EY1', 'SH', 'AH0', 'N', 'Z']), ('accumulation', ['AH0', 'K', 'Y', 'UW2', 'M', 'Y', 'AH0', 'L', 'EY1', 'SH', 'AH0', 'N']), ('accumulations', ['AH0', 'K', 'Y', 'UW2', 'M', 'Y', 'AH0', 'L', 'EY1', 'SH', 'AH0', 'N', 'Z']), ('acetylcholine', ['AH0', 'S', 'EH2', 'T', 'AH0', 'L', 'K', 'OW1', 'L', 'IY0', 'N'])]\n"
     ]
    }
   ],
   "source": [
    "# 提取重音数字(0-无重音，1-主重音，2-次重音)\n",
    "word_list = [\n",
    "        (w, pron)\n",
    "        for w, pron in entries\n",
    "        if stress(pron) == ['0', '2', '0', '1', '0']\n",
    "]\n",
    "print(word_list[:13])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "--------------- >surrealistic< ---------------\nS=S,\nER0=E,R,0,\nIY2=I,Y,2,\nAH0=A,H,0,\nL=L,\nIH1=I,H,1,\nS=S,\nT=T,\nIH0=I,H,0,\nK=K,\n"
     ]
    }
   ],
   "source": [
    "# 拆分映射、列表、字符串的测试\n",
    "ex_pron = ('surrealistic', ['S', 'ER0', 'IY2', 'AH0', 'L', 'IH1', 'S', 'T', 'IH0', 'K'])\n",
    "(word, pron) = ex_pron\n",
    "show_subtitle(word)\n",
    "for phone in pron:\n",
    "    print(phone, end='=')\n",
    "    for char in phone:\n",
    "        print(char, end=',')\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "cfd['P-P']=  <FreqDist with 17 samples and 17 outcomes>\n--------------- >tabulate(P-P, P-R)< ---------------\n     paap paape  paar  pair   pap  pape  papp   par  pare  parr  paup  pear  peep  peer   pep  pier   pip  pipe  pipp  poop  poor poore   pop  pope  popp poppe   por  pore  porr  pour   pup \nP-P     1     1     0     0     1     1     1     0     0     0     1     0     1     0     1     0     1     1     1     1     0     0     1     1     1     1     0     0     0     0     1 \nP-R     0     0     1     1     0     0     0     1     1     1     0     1     0     1     0     1     0     0     0     0     1     1     0     0     0     0     1     1     1     1     0 \nP-P paap paape pap pape papp paup peep pep pip pipe pipp poop pop pope pop...\nP-R paar pair par pare parr pear peer pier poor poore por pore porr pour...\nP-K pac pack paek paik pak pake paque peak peake pech peck peek perc perk ...\nP-S pace pass pasts peace pearse pease perce pers perse pesce piece piss p...\nP-L pahl pail paille pal pale pall paul paule paull peal peale pearl pearl...\nP-N paign pain paine pan pane pawn payne peine pen penh penn pin pine pinn...\nP-Z pais paiz pao's pas pause paws pays paz peas pease pei's perz pez pies...\nP-T pait pat pate patt peart peat peet peete pert pet pete pett piet piett...\nP-CH patch pautsch peach perch petsch petsche piche piech pietsch pitch pit...\nP-UW1 peru peugh pew plew plue prew pru prue prugh pshew pugh...\n"
     ]
    }
   ],
   "source": [
    "# P69 使用条件频率分布寻找相应词汇的最小对比集\n",
    "# 找到所有p开头的三音素词，并比照它们的第一个和最后一个音素来分组\n",
    "p3 = [\n",
    "        (pron[0] + '-' + pron[2], word)\n",
    "        for (word, pron) in entries\n",
    "        if pron[0] == 'P' and len(pron) == 3\n",
    "]\n",
    "cfd = nltk.ConditionalFreqDist(p3)\n",
    "print(\"cfd['P-P']= \", cfd['P-P'])\n",
    "show_subtitle(\"tabulate(P-P, P-R)\")\n",
    "cfd.tabulate(conditions=['P-P', 'P-R'])\n",
    "\n",
    "for template in cfd.conditions():\n",
    "    if len(cfd[template]) > 10:\n",
    "        words = cfd[template].keys()\n",
    "        wordlist = ' '.join(words)\n",
    "        print(template, wordlist[:70] + \"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "prondict['fire']=  [['F', 'AY1', 'ER0'], ['F', 'AY1', 'R']]\nprondict['blog']=  [['B', 'L', 'AA1', 'G']]\n"
     ]
    }
   ],
   "source": [
    "# 访问词典的方式\n",
    "prondict = nltk.corpus.cmudict.dict()\n",
    "print(\"prondict['fire']= \",prondict['fire'])\n",
    "# print(\"prondict['blog'] = \",prondict['blog']  # 词典中没有，报错KeyError\n",
    "# 词典元素赋值\n",
    "prondict['blog'] = [['B', 'L', 'AA1', 'G']]\n",
    "print(\"prondict['blog']= \",prondict['blog'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "word pronoun list=  ['N', 'AE1', 'CH', 'ER0', 'AH0', 'L', 'L', 'AE1', 'NG', 'G', 'W', 'AH0', 'JH', 'P', 'R', 'AA1', 'S', 'EH0', 'S', 'IH0', 'NG']\n"
     ]
    }
   ],
   "source": [
    "# 在词典中寻找单词的发音\n",
    "text = ['natural', 'language', 'processing']\n",
    "pron_list = [\n",
    "        ph\n",
    "        for w in text\n",
    "        for ph in prondict[w][0]\n",
    "]\n",
    "print(\"word pronoun list= \", pron_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "'natural' pronoun list=  [['N', 'AE1', 'CH', 'ER0', 'AH0', 'L'], ['N', 'AE1', 'CH', 'R', 'AH0', 'L'], ['L', 'AE1', 'NG', 'G', 'W', 'AH0', 'JH'], ['L', 'AE1', 'NG', 'G', 'W', 'IH0', 'JH'], ['P', 'R', 'AA1', 'S', 'EH0', 'S', 'IH0', 'NG']]\nprondict['natural']= [['N', 'AE1', 'CH', 'ER0', 'AH0', 'L'], ['N', 'AE1', 'CH', 'R', 'AH0', 'L']]\n"
     ]
    }
   ],
   "source": [
    "# 加[0]是因为natural有两个发音，取其中一个就好了\n",
    "pron_list = [\n",
    "        ph\n",
    "        for w in text\n",
    "        for ph in prondict[w]\n",
    "]\n",
    "print(\"'natural' pronoun list= \", pron_list)\n",
    "print(\"prondict['natural']=\", prondict['natural'])"
   ]
  },
  {
   "source": [
    "### 2.4.3 比较词表（Swadesh wordlists）"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "swadesh.fileids()=  ['be', 'bg', 'bs', 'ca', 'cs', 'cu', 'de', 'en', 'es', 'fr', 'hr', 'it', 'la', 'mk', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sr', 'sw', 'uk']\nswadesh.words('en')=  ['I', 'you (singular), thou', 'he', 'we', 'you (plural)', 'they', 'this', 'that', 'here', 'there', 'who', 'what', 'where', 'when', 'how', 'not', 'all', 'many', 'some', 'few', 'other', 'one', 'two', 'three', 'four', 'five', 'big', 'long', 'wide', 'thick', 'heavy', 'small', 'short', 'narrow', 'thin', 'woman', 'man (adult male)', 'man (human being)', 'child', 'wife', 'husband', 'mother', 'father', 'animal', 'fish', 'bird', 'dog', 'louse', 'snake', 'worm', 'tree', 'forest', 'stick', 'fruit', 'seed', 'leaf', 'root', 'bark (from tree)', 'flower', 'grass', 'rope', 'skin', 'meat', 'blood', 'bone', 'fat (noun)', 'egg', 'horn', 'tail', 'feather', 'hair', 'head', 'ear', 'eye', 'nose', 'mouth', 'tooth', 'tongue', 'fingernail', 'foot', 'leg', 'knee', 'hand', 'wing', 'belly', 'guts', 'neck', 'back', 'breast', 'heart', 'liver', 'drink', 'eat', 'bite', 'suck', 'spit', 'vomit', 'blow', 'breathe', 'laugh', 'see', 'hear', 'know (a fact)', 'think', 'smell', 'fear', 'sleep', 'live', 'die', 'kill', 'fight', 'hunt', 'hit', 'cut', 'split', 'stab', 'scratch', 'dig', 'swim', 'fly (verb)', 'walk', 'come', 'lie', 'sit', 'stand', 'turn', 'fall', 'give', 'hold', 'squeeze', 'rub', 'wash', 'wipe', 'pull', 'push', 'throw', 'tie', 'sew', 'count', 'say', 'sing', 'play', 'float', 'flow', 'freeze', 'swell', 'sun', 'moon', 'star', 'water', 'rain', 'river', 'lake', 'sea', 'salt', 'stone', 'sand', 'dust', 'earth', 'cloud', 'fog', 'sky', 'wind', 'snow', 'ice', 'smoke', 'fire', 'ashes', 'burn', 'road', 'mountain', 'red', 'green', 'yellow', 'white', 'black', 'night', 'day', 'year', 'warm', 'cold', 'full', 'new', 'old', 'good', 'bad', 'rotten', 'dirty', 'straight', 'round', 'sharp', 'dull', 'smooth', 'wet', 'dry', 'correct', 'near', 'far', 'right', 'left', 'at', 'in', 'with', 'and', 'if', 'because', 'name']\n"
     ]
    }
   ],
   "source": [
    "# 包括几种语言的约200个常用词的列表，可以用于比较两个语言之间的差别，也可以用于不同语言的单词翻译\n",
    "from nltk.corpus import swadesh\n",
    "\n",
    "print(\"swadesh.fileids()= \",swadesh.fileids())\n",
    "print(\"swadesh.words('en')= \",swadesh.words('en'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "fr2en=  [('je', 'I'), ('tu, vous', 'you (singular), thou'), ('il', 'he'), ('nous', 'we'), ('vous', 'you (plural)'), ('ils, elles', 'they'), ('ceci', 'this'), ('cela', 'that'), ('ici', 'here'), ('là', 'there'), ('qui', 'who'), ('quoi', 'what'), ('où', 'where')]\ntranslate['chien']=  dog\n"
     ]
    }
   ],
   "source": [
    "fr2en = swadesh.entries(['fr', 'en'])\n",
    "print(\"fr2en= \",fr2en[:13])\n",
    "translate = dict(fr2en)\n",
    "print(\"translate['chien']= \", translate['chien'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "translate=  {'je': 'I', 'tu, vous': 'you (singular), thou', 'il': 'he', 'nous': 'we', 'vous': 'you (plural)', 'ils, elles': 'they', 'ceci': 'this', 'cela': 'that', 'ici': 'here', 'là': 'there', 'qui': 'who', 'quoi': 'what', 'où': 'where', 'quand': 'when', 'comment': 'how', 'ne...pas': 'not', 'tout': 'all', 'plusieurs': 'many', 'quelques': 'some', 'peu': 'few', 'autre': 'other', 'un': 'one', 'deux': 'two', 'trois': 'three', 'quatre': 'four', 'cinq': 'five', 'grand': 'big', 'long': 'long', 'large': 'wide', 'épais': 'thick', 'lourd': 'heavy', 'petit': 'small', 'court': 'short', 'étroit': 'narrow', 'mince': 'thin', 'femme': 'woman', 'homme': 'man (human being)', 'enfant': 'child', 'femme, épouse': 'wife', 'mari, époux': 'husband', 'mère': 'mother', 'père': 'father', 'animal': 'animal', 'poisson': 'fish', 'oiseau': 'bird', 'chien': 'dog', 'pou': 'louse', 'serpent': 'snake', 'ver': 'worm', 'arbre': 'tree', 'forêt': 'forest', 'bâton': 'stick', 'fruit': 'fruit', 'graine': 'seed', 'feuille': 'leaf', 'racine': 'root', 'écorce': 'bark (from tree)', 'fleur': 'flower', 'herbe': 'grass', 'corde': 'rope', 'peau': 'skin', 'viande': 'meat', 'sang': 'blood', 'os': 'bone', 'graisse': 'fat (noun)', 'œuf': 'egg', 'corne': 'horn', 'queue': 'tail', 'plume': 'feather', 'cheveu': 'hair', 'tête': 'head', 'oreille': 'ear', 'œil': 'eye', 'nez': 'nose', 'bouche': 'mouth', 'dent': 'tooth', 'langue': 'tongue', 'ongle': 'fingernail', 'pied': 'foot', 'jambe': 'leg', 'genou': 'knee', 'main': 'hand', 'aile': 'wing', 'ventre': 'belly', 'entrailles': 'guts', 'cou': 'neck', 'dos': 'back', 'sein, poitrine': 'breast', 'cœur': 'heart', 'foie': 'liver', 'boire': 'drink', 'manger': 'eat', 'mordre': 'bite', 'sucer': 'suck', 'cracher': 'spit', 'vomir': 'vomit', 'souffler': 'blow', 'respirer': 'breathe', 'rire': 'laugh', 'voir': 'see', 'entendre': 'hear', 'savoir': 'know (a fact)', 'penser': 'think', 'sentir': 'smell', 'craindre, avoir peur': 'fear', 'dormir': 'sleep', 'vivre': 'live', 'mourir': 'die', 'tuer': 'kill', 'se battre': 'fight', 'chasser': 'hunt', 'frapper': 'hit', 'couper': 'cut', 'fendre': 'split', 'poignarder': 'stab', 'gratter': 'scratch', 'creuser': 'dig', 'nager': 'swim', 'voler': 'fly (verb)', 'marcher': 'walk', 'venir': 'come', \"s'étendre\": 'lie', \"s'asseoir\": 'sit', 'se lever': 'stand', 'tourner': 'turn', 'tomber': 'fall', 'donner': 'give', 'tenir': 'hold', 'serrer': 'squeeze', 'frotter': 'rub', 'laver': 'wash', 'essuyer': 'wipe', 'tirer': 'pull', 'pousser': 'push', 'jeter': 'throw', 'lier': 'tie', 'coudre': 'sew', 'compter': 'count', 'dire': 'say', 'chanter': 'sing', 'jouer': 'play', 'flotter': 'float', 'couler': 'flow', 'geler': 'freeze', 'gonfler': 'swell', 'soleil': 'sun', 'lune': 'moon', 'étoile': 'star', 'eau': 'water', 'pluie': 'rain', 'rivière': 'river', 'lac': 'lake', 'mer': 'sea', 'sel': 'salt', 'pierre': 'stone', 'sable': 'sand', 'poussière': 'dust', 'terre': 'earth', 'nuage': 'cloud', 'brouillard': 'fog', 'ciel': 'sky', 'vent': 'wind', 'neige': 'snow', 'glace': 'ice', 'fumée': 'smoke', 'feu': 'fire', 'cendres': 'ashes', 'brûler': 'burn', 'route': 'road', 'montagne': 'mountain', 'rouge': 'red', 'vert': 'green', 'jaune': 'yellow', 'blanc': 'white', 'noir': 'black', 'nuit': 'night', 'jour': 'day', 'an, année': 'year', 'chaud': 'warm', 'froid': 'cold', 'plein': 'full', 'nouveau': 'new', 'vieux': 'old', 'bon': 'good', 'mauvais': 'bad', 'pourri': 'rotten', 'sale': 'dirty', 'droit': 'straight', 'rond': 'round', 'tranchant, pointu, aigu': 'sharp', 'émoussé': 'dull', 'lisse': 'smooth', 'mouillé': 'wet', 'sec': 'dry', 'juste, correct': 'correct', 'proche': 'near', 'loin': 'far', 'à droite': 'right', 'à gauche': 'left', 'à': 'at', 'dans': 'in', 'avec': 'with', 'et': 'and', 'si': 'if', 'parce que': 'because', 'nom': 'name'}\n"
     ]
    }
   ],
   "source": [
    "print(\"translate= \", translate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "translate['jeter']=  throw\ntranslate['Hund']=  dog\ntranslate['perro']=  dog\n"
     ]
    }
   ],
   "source": [
    "de2en = swadesh.entries(['de', 'en'])\n",
    "translate.update(dict(de2en))\n",
    "es2en = swadesh.entries(['es', 'en'])\n",
    "translate.update(dict(es2en))\n",
    "print(\"translate['jeter']= \", translate['jeter'])\n",
    "print(\"translate['Hund']= \", translate['Hund'])\n",
    "print(\"translate['perro']= \", translate['perro'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "translate=  {'je': 'I', 'tu, vous': 'you (singular), thou', 'il': 'he', 'nous': 'we', 'vous': 'you (plural)', 'ils, elles': 'they', 'ceci': 'this', 'cela': 'that', 'ici': 'here', 'là': 'there', 'qui': 'who', 'quoi': 'what', 'où': 'where', 'quand': 'when', 'comment': 'how', 'ne...pas': 'not', 'tout': 'all', 'plusieurs': 'many', 'quelques': 'some', 'peu': 'few', 'autre': 'other', 'un': 'one', 'deux': 'two', 'trois': 'three', 'quatre': 'four', 'cinq': 'five', 'grand': 'big', 'long': 'long', 'large': 'wide', 'épais': 'thick', 'lourd': 'heavy', 'petit': 'small', 'court': 'short', 'étroit': 'narrow', 'mince': 'thin', 'femme': 'woman', 'homme': 'man (human being)', 'enfant': 'child', 'femme, épouse': 'wife', 'mari, époux': 'husband', 'mère': 'mother', 'père': 'father', 'animal': 'animal', 'poisson': 'fish', 'oiseau': 'bird', 'chien': 'dog', 'pou': 'louse', 'serpent': 'snake', 'ver': 'see', 'arbre': 'tree', 'forêt': 'forest', 'bâton': 'stick', 'fruit': 'fruit', 'graine': 'seed', 'feuille': 'leaf', 'racine': 'root', 'écorce': 'bark (from tree)', 'fleur': 'flower', 'herbe': 'grass', 'corde': 'rope', 'peau': 'skin', 'viande': 'meat', 'sang': 'blood', 'os': 'bone', 'graisse': 'fat (noun)', 'œuf': 'egg', 'corne': 'horn', 'queue': 'tail', 'plume': 'feather', 'cheveu': 'hair', 'tête': 'head', 'oreille': 'ear', 'œil': 'eye', 'nez': 'nose', 'bouche': 'mouth', 'dent': 'tooth', 'langue': 'tongue', 'ongle': 'fingernail', 'pied': 'foot', 'jambe': 'leg', 'genou': 'knee', 'main': 'hand', 'aile': 'wing', 'ventre': 'belly', 'entrailles': 'guts', 'cou': 'neck', 'dos': 'two', 'sein, poitrine': 'breast', 'cœur': 'heart', 'foie': 'liver', 'boire': 'drink', 'manger': 'eat', 'mordre': 'bite', 'sucer': 'suck', 'cracher': 'spit', 'vomir': 'vomit', 'souffler': 'blow', 'respirer': 'breathe', 'rire': 'laugh', 'voir': 'see', 'entendre': 'hear', 'savoir': 'know (a fact)', 'penser': 'think', 'sentir': 'smell', 'craindre, avoir peur': 'fear', 'dormir': 'sleep', 'vivre': 'live', 'mourir': 'die', 'tuer': 'kill', 'se battre': 'fight', 'chasser': 'hunt', 'frapper': 'hit', 'couper': 'cut', 'fendre': 'split', 'poignarder': 'stab', 'gratter': 'scratch', 'creuser': 'dig', 'nager': 'swim', 'voler': 'fly (verb)', 'marcher': 'walk', 'venir': 'come', \"s'étendre\": 'lie', \"s'asseoir\": 'sit', 'se lever': 'stand', 'tourner': 'turn', 'tomber': 'fall', 'donner': 'give', 'tenir': 'hold', 'serrer': 'squeeze', 'frotter': 'rub', 'laver': 'wash', 'essuyer': 'wipe', 'tirer': 'pull', 'pousser': 'push', 'jeter': 'throw', 'lier': 'tie', 'coudre': 'sew', 'compter': 'count', 'dire': 'say', 'chanter': 'sing', 'jouer': 'play', 'flotter': 'float', 'couler': 'flow', 'geler': 'freeze', 'gonfler': 'swell', 'soleil': 'sun', 'lune': 'moon', 'étoile': 'star', 'eau': 'water', 'pluie': 'rain', 'rivière': 'river', 'lac': 'lake', 'mer': 'sea', 'sel': 'salt', 'pierre': 'stone', 'sable': 'sand', 'poussière': 'dust', 'terre': 'earth', 'nuage': 'cloud', 'brouillard': 'fog', 'ciel': 'sky', 'vent': 'wind', 'neige': 'snow', 'glace': 'ice', 'fumée': 'smoke', 'feu': 'fire', 'cendres': 'ashes', 'brûler': 'burn', 'route': 'road', 'montagne': 'mountain', 'rouge': 'red', 'vert': 'green', 'jaune': 'yellow', 'blanc': 'white', 'noir': 'black', 'nuit': 'night', 'jour': 'day', 'an, année': 'year', 'chaud': 'warm', 'froid': 'cold', 'plein': 'full', 'nouveau': 'new', 'vieux': 'old', 'bon': 'good', 'mauvais': 'bad', 'pourri': 'rotten', 'sale': 'dirty', 'droit': 'straight', 'rond': 'round', 'tranchant, pointu, aigu': 'sharp', 'émoussé': 'dull', 'lisse': 'smooth', 'mouillé': 'wet', 'sec': 'dry', 'juste, correct': 'correct', 'proche': 'near', 'loin': 'far', 'à droite': 'right', 'à gauche': 'left', 'à': 'at', 'dans': 'in', 'avec': 'with', 'et': 'and', 'si': 'if', 'parce que': 'because', 'nom': 'name', 'ich': 'I', 'du, Sie': 'you (singular), thou', 'er': 'he', 'wir': 'we', 'ihr, Sie': 'you (plural)', 'sie': 'they', 'dieses': 'this', 'jenes': 'that', 'hier': 'here', 'dort': 'there', 'wer': 'who', 'was': 'what', 'wo': 'where', 'wann': 'when', 'wie': 'how', 'nicht': 'not', 'alle': 'all', 'viele': 'many', 'einige': 'some', 'wenige': 'few', 'andere': 'other', 'eins': 'one', 'zwei': 'two', 'drei': 'three', 'vier': 'four', 'fünf': 'five', 'groß': 'big', 'lang': 'long', 'breit, weit': 'wide', 'dick': 'thick', 'schwer': 'heavy', 'klein': 'small', 'kurz': 'short', 'eng': 'narrow', 'dünn': 'thin', 'Frau': 'woman', 'Mann': 'man (adult male)', 'Mensch': 'man (human being)', 'Kind': 'child', 'Frau, Ehefrau': 'wife', 'Mann, Ehemann': 'husband', 'Mutter': 'mother', 'Vater': 'father', 'Tier': 'animal', 'Fisch': 'fish', 'Vogel': 'bird', 'Hund': 'dog', 'Laus': 'louse', 'Schlange': 'snake', 'Wurm': 'worm', 'Baum': 'tree', 'Wald': 'forest', 'Stock': 'stick', 'Frucht': 'fruit', 'Samen': 'seed', 'Blatt': 'leaf', 'Wurzel': 'root', 'Rinde': 'bark (from tree)', 'Blume': 'flower', 'Gras': 'grass', 'Seil': 'rope', 'Haut': 'skin', 'Fleisch': 'meat', 'Blut': 'blood', 'Knochen': 'bone', 'Fett': 'fat (noun)', 'Ei': 'egg', 'Horn': 'horn', 'Schwanz': 'tail', 'Feder': 'feather', 'Haar': 'hair', 'Kopf, Haupt': 'head', 'Ohr': 'ear', 'Auge': 'eye', 'Nase': 'nose', 'Mund': 'mouth', 'Zahn': 'tooth', 'Zunge': 'tongue', 'Fingernagel': 'fingernail', 'Fuß': 'foot', 'Bein': 'leg', 'Knie': 'knee', 'Hand': 'hand', 'Flügel': 'wing', 'Bauch': 'belly', 'Eingeweide, Innereien': 'guts', 'Hals': 'neck', 'Rücken': 'back', 'Brust': 'breast', 'Herz': 'heart', 'Leber': 'liver', 'trinken': 'drink', 'essen': 'eat', 'beißen': 'bite', 'saugen': 'suck', 'spucken': 'spit', 'erbrechen': 'vomit', 'blasen': 'blow', 'atmen': 'breathe', 'lachen': 'laugh', 'sehen': 'see', 'hören': 'hear', 'wissen': 'know (a fact)', 'denken': 'think', 'riechen': 'smell', 'fürchten': 'fear', 'schlafen': 'sleep', 'leben': 'live', 'sterben': 'die', 'töten': 'kill', 'kämpfen': 'fight', 'jagen': 'hunt', 'schlagen': 'hit', 'schneiden': 'cut', 'spalten': 'split', 'stechen': 'stab', 'kratzen': 'scratch', 'graben': 'dig', 'schwimmen': 'swim', 'fliegen': 'fly (verb)', 'gehen': 'walk', 'kommen': 'come', 'liegen': 'lie', 'sitzen': 'sit', 'stehen': 'stand', 'drehen': 'turn', 'fallen': 'fall', 'geben': 'give', 'halten': 'hold', 'quetschen': 'squeeze', 'reiben': 'rub', 'waschen': 'wash', 'wischen': 'wipe', 'ziehen': 'pull', 'drücken': 'push', 'werfen': 'throw', 'binden': 'tie', 'nähen': 'sew', 'zählen': 'count', 'sagen': 'say', 'singen': 'sing', 'spielen': 'play', 'schweben': 'float', 'fließen': 'flow', 'frieren': 'freeze', 'schwellen': 'swell', 'Sonne': 'sun', 'Mond': 'moon', 'Stern': 'star', 'Wasser': 'water', 'Regen': 'rain', 'Fluß': 'river', 'See': 'lake', 'Meer, See': 'sea', 'Salz': 'salt', 'Stein': 'stone', 'Sand': 'sand', 'Staub': 'dust', 'Erde': 'earth', 'Wolke': 'cloud', 'Nebel': 'fog', 'Himmel': 'sky', 'Wind': 'wind', 'Schnee': 'snow', 'Eis': 'ice', 'Rauch': 'smoke', 'Feuer': 'fire', 'Asche': 'ashes', 'brennen': 'burn', 'Straße': 'road', 'Berg': 'mountain', 'rot': 'red', 'grün': 'green', 'gelb': 'yellow', 'weiß': 'white', 'schwarz': 'black', 'Nacht': 'night', 'Tag': 'day', 'Jahr': 'year', 'warm': 'warm', 'kalt': 'cold', 'voll': 'full', 'neu': 'new', 'alt': 'old', 'gut': 'good', 'schlecht': 'bad', 'verrottet': 'rotten', 'schmutzig': 'dirty', 'gerade': 'straight', 'rund': 'round', 'scharf': 'sharp', 'stumpf': 'dull', 'glatt': 'smooth', 'nass, feucht': 'wet', 'trocken': 'dry', 'richtig': 'correct', 'nah, nahe': 'near', 'weit, fern': 'far', 'rechts': 'right', 'links': 'left', 'bei, an': 'at', 'in': 'in', 'mit': 'with', 'und': 'and', 'wenn, falls, ob': 'if', 'weil': 'because', 'Name': 'name', 'yo': 'I', 'tú, usted': 'you (singular), thou', 'él': 'he', 'nosotros': 'we', 'vosotros, ustedes': 'you (plural)', 'ellos, ellas': 'they', 'este': 'this', 'ese, aquel': 'that', 'aquí, acá': 'here', 'ahí, allí, allá': 'there', 'quien': 'who', 'que': 'what', 'donde': 'where', 'cuando': 'when', 'como': 'how', 'no': 'not', 'todo': 'all', 'muchos': 'many', 'algunos, unos': 'some', 'poco': 'few', 'otro': 'other', 'uno': 'one', 'tres': 'three', 'cuatro': 'four', 'cinco': 'five', 'grande': 'big', 'largo': 'long', 'ancho': 'wide', 'gordo': 'thick', 'pesado': 'heavy', 'pequeño': 'small', 'corto': 'short', 'estrecho, angosto': 'narrow', 'delgado, flaco': 'thin', 'mujer': 'woman', 'hombre': 'man (human being)', 'niño': 'child', 'esposa, mujer': 'wife', 'esposo, marido': 'husband', 'madre': 'mother', 'padre': 'father', 'pez, pescado': 'fish', 'ave, pájaro': 'bird', 'perro': 'dog', 'piojo': 'louse', 'serpiente, culebra': 'snake', 'gusano': 'worm', 'árbol': 'tree', 'bosque': 'forest', 'palo': 'stick', 'fruta': 'fruit', 'semilla': 'seed', 'hoja': 'leaf', 'raíz': 'root', 'corteza': 'bark (from tree)', 'flor': 'flower', 'hierba, pasto': 'grass', 'cuerda': 'rope', 'piel': 'skin', 'carne': 'meat', 'sangre': 'blood', 'hueso': 'bone', 'grasa': 'fat (noun)', 'huevo': 'egg', 'cuerno': 'horn', 'cola': 'tail', 'pluma': 'feather', 'cabello, pelo': 'hair', 'cabeza': 'head', 'oreja': 'ear', 'ojo': 'eye', 'nariz': 'nose', 'boca': 'mouth', 'diente': 'tooth', 'lengua': 'tongue', 'uña': 'fingernail', 'pie': 'foot', 'pierna': 'leg', 'rodilla': 'knee', 'mano': 'hand', 'ala': 'wing', 'barriga, vientre, panza': 'belly', 'entrañas, tripas': 'guts', 'cuello': 'neck', 'espalda': 'back', 'pecho, seno': 'breast', 'corazón': 'heart', 'hígado': 'liver', 'beber, tomar': 'drink', 'comer': 'eat', 'morder': 'bite', 'chupar': 'suck', 'escupir': 'spit', 'vomitar': 'vomit', 'soplar': 'blow', 'respirar': 'breathe', 'reír': 'laugh', 'oír': 'hear', 'saber': 'know (a fact)', 'pensar': 'think', 'oler': 'smell', 'temer': 'fear', 'vivir': 'live', 'morir': 'die', 'matar': 'kill', 'pelear': 'fight', 'cazar': 'hunt', 'golpear': 'hit', 'cortar': 'cut', 'partir': 'split', 'apuñalar': 'stab', 'arañar, rascar': 'scratch', 'cavar': 'dig', 'nadar': 'swim', 'volar': 'fly (verb)', 'caminar': 'walk', 'echarse, acostarse, tenderse': 'lie', 'sentarse': 'sit', 'estar de pie': 'stand', 'voltear': 'turn', 'caer': 'fall', 'dar': 'give', 'sostener': 'hold', 'apretar': 'squeeze', 'frotar': 'rub', 'lavar': 'wash', 'limpiar': 'wipe', 'tirar': 'throw', 'empujar': 'push', 'atar': 'tie', 'coser': 'sew', 'contar': 'count', 'decir': 'say', 'cantar': 'sing', 'jugar': 'play', 'flotar': 'float', 'fluir': 'flow', 'helar': 'freeze', 'hincharse': 'swell', 'sol': 'sun', 'luna': 'moon', 'estrella': 'star', 'agua': 'water', 'lluvia': 'rain', 'río': 'river', 'lago': 'lake', 'mar': 'sea', 'sal': 'salt', 'piedra': 'stone', 'arena': 'sand', 'polvo': 'dust', 'tierra': 'earth', 'nube': 'cloud', 'niebla': 'fog', 'cielo': 'sky', 'viento': 'wind', 'nieve': 'snow', 'hielo': 'ice', 'humo': 'smoke', 'fuego': 'fire', 'cenizas': 'ashes', 'quemar': 'burn', 'camino': 'road', 'montaña': 'mountain', 'rojo': 'red', 'verde': 'green', 'amarillo': 'yellow', 'blanco': 'white', 'negro': 'black', 'noche': 'night', 'día': 'day', 'año': 'year', 'cálido, tibio': 'warm', 'frío': 'cold', 'lleno': 'full', 'nuevo': 'new', 'viejo': 'old', 'bueno': 'good', 'malo': 'bad', 'podrido': 'rotten', 'sucio': 'dirty', 'recto': 'straight', 'redondo': 'round', 'afilado': 'sharp', 'desafilado': 'dull', 'suave, liso': 'smooth', 'mojado': 'wet', 'seco': 'dry', 'correcto': 'correct', 'cerca': 'near', 'lejos': 'far', 'derecha': 'right', 'izquierda': 'left', 'a, en, ante': 'at', 'en': 'in', 'con': 'with', 'y': 'and', 'porque': 'because', 'nombre': 'name'}\n"
     ]
    }
   ],
   "source": [
    "print(\"translate= \", translate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "('say', 'sagen', 'zeggen', 'decir', 'dire', 'dizer', 'dicere')\n",
      "('sing', 'singen', 'zingen', 'cantar', 'chanter', 'cantar', 'canere')\n",
      "('play', 'spielen', 'spelen', 'jugar', 'jouer', 'jogar, brincar', 'ludere')\n",
      "('float', 'schweben', 'zweven', 'flotar', 'flotter', 'flutuar, boiar', 'fluctuare')\n"
     ]
    }
   ],
   "source": [
    "languages = ['en', 'de', 'nl', 'es', 'fr', 'pt', 'la']\n",
    "for i in [139, 140, 141, 142]:\n",
    "    print(swadesh.entries(languages)[i])"
   ]
  },
  {
   "source": [
    "### 2.4.4 词汇工具：Toolbox 和 Shoebox\n",
    "[Toolbox](http://www.sil.org/computing/toolbox/)\n",
    "\n",
    "Toolbox 文件由一些条目的集合组成，其中每个条目由一个 或者 多个字段组成。\n",
    "大多数字段都是可选的 或者  重复的，因此这个词汇资源不能作为一个表格 或者 电子表格处理。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "('kaa', [('ps', 'V'), ('pt', 'A'), ('ge', 'gag'), ('tkp', 'nek i pas'), ('dcsv', 'true'), ('vx', '1'), ('sc', '???'), ('dt', '29/Oct/2005'), ('ex', 'Apoka ira kaaroi aioa-ia reoreopaoro.'), ('xp', 'Kaikai i pas long nek bilong Apoka bikos em i kaikai na toktok.'), ('xe', 'Apoka is gagging from food while talking.')])\n('kaa', [('ps', 'V'), ('pt', 'B'), ('ge', 'strangle'), ('tkp', 'pasim nek'), ('arg', 'O'), ('vx', '2'), ('dt', '07/Oct/2006'), ('ex', 'Rera rauroro rera kaarevoi.'), ('xp', 'Em i holim pas em na nekim em.'), ('xe', 'He is holding him and strangling him.'), ('ex', 'Iroiro-ia oirato okoearo kaaivoi uvare rirovira kaureoparoveira.'), ('xp', 'Ol i pasim nek bilong man long rop bikos em i save bikhet tumas.'), ('xe', \"They strangled the man's neck with rope because he was very stubborn and arrogant.\"), ('ex', 'Oirato okoearo kaaivoi iroiro-ia. Uva viapau uvuiparoi ra vovouparo uva kopiiroi.'), ('xp', 'Ol i pasim nek bilong man long rop. Olsem na em i no pulim win olsem na em i dai.'), ('xe', \"They strangled the man's neck with a rope. And he couldn't breathe and he died.\")])\n('kaa', [('ps', 'N'), ('pt', 'MASC'), ('cl', 'isi'), ('ge', 'cooking banana'), ('tkp', 'banana bilong kukim'), ('pt', 'itoo'), ('sf', 'FLORA'), ('dt', '12/Aug/2005'), ('ex', 'Taeavi iria kaa isi kovopaueva kaparapasia.'), ('xp', 'Taeavi i bin planim gaden banana bilong kukim tasol long paia.'), ('xe', 'Taeavi planted banana in order to cook it.')])\n('kaakaaro', [('ps', 'N'), ('pt', 'NT'), ('ge', 'mixture'), ('tkp', '???'), ('eng', 'mixtures'), ('eng', 'charm used to keep married men and women youthful and attractive'), ('cmt', 'Check vowel length. Is it kaakaaro or kaakaro? Does lexeme have suffix, -aro or -ro?'), ('dt', '20/Nov/2006'), ('ex', 'Kaakaroto ira purapaiveira aue iava opita, voeao-pa airepa oraouirara, ra va aiopaive.'), ('xp', 'Kokonas ol i save wokim long ol kain samting bilong ol nupela marit, bai ol i ken kaikai.'), ('xe', 'Mixtures are made from coconut for newlyweds, who eat them.')])\n('kaakaaviko', [('ps', 'N'), ('pt', 'FEM'), ('ge', 'type of beetle'), ('tkp', '???'), ('nt', 'round beetle like Mexican bean beetle'), ('dt', '10/Feb/2005'), ('sf', 'FAUNA.INSECT'), ('ex', 'Kaakaaviko kare oea binara touaveira vara tapo piupaiveira.'), ('xp', 'Kaakaaviko em i wanpela kain insect em i save istap long ol bin or na long kain lip.'), ('xe', '???'), ('ex', 'Kaakaaviko kare oea raviriro kouro piupaiveira.'), ('xp', 'Em i wanpela kain weevil i save bagarapim ol bin.'), ('xe', '??? damages up beans.')])\n('kaakaavo', [('rt', 'kaavo'), ('ps', '???'), ('rdp', 'partial'), ('ge', 'white'), ('tkp', 'wait'), ('sc', '???'), ('cmt', \"What's the part of speech?\"), ('dt', '29/Oct/2005'), ('ex', 'Kaakaaro oa purapaiveira varauraro tokipasia aue iava opita ora vegoara iava oirara iava ora riakova kaakaaro.'), ('xp', 'Ol i save wokim out long kokonas coconut na ol lip na skin blong ol diwai.'), ('xe', '???'), ('ex', 'Varoa kaakaavopa popotepa ragai varo.'), ('xp', 'Em white lap lap blong mi.'), ('xe', \"That's my white laplap.\"), ('ex', 'Vaoia evaova kaakaavopaova.'), ('xp', 'Dispela diwai em i waitpela.'), ('xe', 'This tree is white.'), ('ex', 'Rarasoria kaakaavoto ira Amerika iava urioroera vo kovosia rupairara voaro.'), ('xp', 'Rarason em i wait man em i bin kam long Amerika na kam wok long hap bilong ol bilak man.'), ('xe', 'Rarason is a white man who came from America ???.')])\n('kaakaoko', [('ps', 'N'), ('pt', '???'), ('ge', 'type of beetle'), ('tkp', 'binatang'), ('sf', 'FAUNA.INSECT'), ('cmt', 'Is it kaakaoko or kaakauko?'), ('dt', '08/Feb/2005'), ('ex', 'Kaakaoko vuri gesito./Kaakauko vurisi gesiva.'), ('xp', '???'), ('xe', 'Kaakauko em i wanpela binatang.')])\n('kaakasi', [('rt', '???'), ('ps', 'V'), ('pt', 'A'), ('ge', 'hot'), ('tkp', 'hot'), ('vx', '1'), ('sc', '???'), ('cmt', \"Vowel length can't possibly be right. Or is the vowel of kaasi long?\"), ('dt', '29/Oct/2005'), ('ex', 'Upiriko pitoka kaakasipai.'), ('xp', 'Sospen kaukau em i hot tru.'), ('xe', 'The saucepan of sweet potatos is really hot.'), ('ex', 'Kaukau pitoka rirovira rutu kaakasipai uvare riro kasia tuitui kasi oripiro.'), ('xp', 'Sospen kaukau em i hot tru bikos em i tan long bikpela paia.'), ('xe', '???')])\n('kaakau', [('ps', 'N'), ('pt', 'FEM'), ('ge', 'dog'), ('tkp', 'dok'), ('dt', '17/Jul/2005'), ('ex', 'Kaakau voresiurava toupa aue kokoto ora kokopi.'), ('xp', 'Dog i gat fopela lek bilong em na em i teleblonge.'), ('xe', 'Dogs are four-footed ???.'), ('ex', 'Revisa riro kaakau raguito.'), ('xp', 'Revisa em i man bilong lukautim dok.'), ('xe', 'Revisa is a big dog lover.'), ('ex', 'Rake ora Jon kaakau kare ousia avasie.'), ('xp', 'Rake wantaim Jon ol i go kisim ol wail dok.'), ('xe', 'Rake and John went to get wild dogs.')])\n('kaakauko', [('ps', 'N'), ('pt', 'MASC'), ('ge', 'gray weevil'), ('tkp', 'wanpela kain binatang'), ('sf', 'FAUNA.INSECT'), ('nt', 'pictured on PNG postage stamp'), ('dt', '29/Oct/2005'), ('ex', 'Kaakauko ira toupareveira aue-ia niugini stemp.'), ('xp', 'Kaakauko em insect em i istap long niugini.'), ('xe', 'The gray weevil is found on the PNG stamp.'), ('ex', 'Kaakauko iria toupaeveira niugini stamia.'), ('xp', 'Weevil i stap long niguini stamp.'), ('xe', 'The gray weevil is on the New Guinea stamp.'), ('ex', 'Kaakauko korekare iava oira iria iava varaua vurivurivira ora kaapovira toupaiveira.'), ('xp', 'Kaakavuko em i wanpela kain binatang skin bilong em i braun na wait.'), ('xe', 'Kaakavuko is an insect whose body is brown and white.')])\n('kaakito', [('rt', 'kaaki'), ('ps', 'N'), ('pt', 'HUM'), ('ge', 'person blind with cataracts'), ('tkp', 'man i gat wanpela ei'), ('nt', 'nickname when used to describe one-eyed person'), ('dt', '11/Feb/2005'), ('ex', 'Rarasirea kakito eisiva rera Tavusiva uruiia.'), ('xp', 'Rarasirea em i wan ai man bilong ples Tavusiova.'), ('xe', 'Rarasirea is a one-eyed man from Tavusiova village.'), ('ex', 'Kaakito kataitoa iava osireito vurapare.'), ('xp', 'Man i gat wanpela ei na i lukluk.'), ('xe', 'A one-eyed man looks out of one eye.')])\n('kaakuupato', [('ps', 'N'), ('pt', 'PN'), ('ge', 'spring of hot mineral water near Togarao.'), ('tkp', '???'), ('nt', 'It is located in gulley above the shorter waterfall and is most likely ???.'), ('dt', '08/Feb/2005'), ('ex', 'Kasiraopato kaakuupato uicoto ira vusivusipareveira vova rasito vo toupare togarao-ia sisiupaveira vosa upiapave ora ruvapasa.'), ('xp', 'Kaakuupato em i spirins hot water em i stap long Togavao taim husat i sik bai ol waswas long bai sick br pinis .'), ('xe', '???'), ('ex', 'Kaakuupato kasiraopato ukoto ira toupare eisi Rureva Togaraoia ruvaraia.'), ('xp', 'Hot wara kaakuupato i stap long Rureva klostu long Togarao.'), ('xe', 'The hot spring Kaakuupato is in Rureva near Togarao.')])\n('kaaova', [('ps', 'N'), ('pt', 'FEM'), ('ge', 'aunt'), ('tkp', '???'), ('nt', 'FaSi'), ('sf', 'KIN'), ('dt', '19/Jul/2004')])\n('kaapa', [('ps', 'N'), ('pt', '???'), ('ge', 'copper metal'), ('tkp', 'retpela ain'), ('dt', '12/Feb/2005'), ('cmt', 'What is paupara doing in the second example?'), ('ex', 'Kaapa vao oa-ia kepa paupaviei.'), ('xp', 'Kaapa em i roof yumi save wokim haus long em.'), ('xe', 'Copper we make houses from.'), ('ex', 'Kaapara kepa paupara oara purapaiveira eisi Astararia.'), ('xp', 'Kapa bilong wokim haus ol i save wokim long Australia.'), ('xe', 'Copper rooves, they make them in Australia.')])\n"
     ]
    }
   ],
   "source": [
    "from nltk.corpus import toolbox\n",
    "\n",
    "rotokas = toolbox.entries('rotokas.dic')\n",
    "for i, word in enumerate(rotokas):\n",
    "    if i<=13:\n",
    "        print(word)"
   ]
  }
 ]
}